[小ネタ]CloudFormation StackSetsでConfigを全リージョン有効化しつつグローバルリソース記録は特定のリージョンのみで有効化する
こんにちは、おんづか(@onzuka_muscle)です!
AWSが公開しているAWS Configベストプラクティスをご覧になったことありますでしょうか。
その中に「3.1 つのリージョンでのみグローバルリソース (IAM リソースなど) を記録します。」という項目があります。
3.1 つのリージョンでのみグローバルリソース (IAM リソースなど) を記録します。 これにより、IAM 設定アイテムの冗長コピーをすべてのリージョンで取得することがなくなります。それは費用の節約にもなります。
グローバルリソース(IAMなど)とはリージョンに属さないリソースのことです。
全リージョンでConfigを有効化しておりそれぞれでグローバルリソース記録を有効にしている場合、あるグローバルリソースを変更するとその記録が全リージョンで行われてしまいます。
同じ内容を重複して記録してしまう上に、課金はリージョン毎に発生するので請求額が膨らみます。
それはもったいないので辞めようね、とうのがこのベストプラクティスの言いたいことになります。
こちらで実際に課金が膨らんでしまった話を紹介しています。(スライドが分かりやすい上に面白いのでおすすめです。)
さて本題ですがCloudFormation StackSetsを活用してConfigの全リージョン有効化をしつつ、このベストプラクティスに則ってみます。
テンプレート
CloudFormation StackSetsで展開するテンプレートです。
us-east-1でのみグローバルリソース記録を有効にするテンプレートになってます。
AWSTemplateFormatVersion: "2010-09-09" # Configのグローバルリソース記録をus-east-1のみ有効にするための条件 Conditions: IncludeGlobalResourceRegion: !Equals [!Ref AWS::Region, us-east-1] Parameters: ConfigName: Description: Config Name Type: String S3Bucket: Description: Bucket Name Type: String Resources: AWSServiceRoleForConfig: Type: "AWS::IAM::ServiceLinkedRole" Properties: AWSServiceName: config.amazonaws.com ConfigRecorder: Type: AWS::Config::ConfigurationRecorder Properties: Name: !Ref ConfigName RecordingGroup: AllSupported: true # Configのグローバルリソース記録をus-east-1のみ有効にする IncludeGlobalResourceTypes: !If [IncludeGlobalResourceRegion, true, false] RoleARN: !Sub arn:aws:iam::${AWS::AccountId}:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig ConfigDeliveryChannel: Type: AWS::Config::DeliveryChannel Properties: Name: !Ref ConfigName S3BucketName: !Ref S3Bucket
以下、抜粋して説明します。
Conditionsで「スタックが作成されるリージョンがus-east-1かどうか」を判定しています。
# Configのグローバルリソース記録をus-east-1のみ有効にするための条件 Conditions: IncludeGlobalResourceRegion: !Equals [!Ref AWS::Region, us-east-1]
IncludeGlobalResourceTypes(グローバルリソース記録するかどうか)で先ほどの条件を用いて有効・無効を切り替えています。
RecordingGroup: AllSupported: true # Configのグローバルリソース記録をus-east-1のみ有効にする IncludeGlobalResourceTypes: !If [IncludeGlobalResourceRegion, true, false]
なおConfigの配信先S3バケットについては事前に用意しています。下記のアクセス許可が必要なので注意しましょう。
CloudFormation StackSetsで展開してみる
StackSetsを作成していきます。
利用可能な全リージョンを選択します。
StackSetsの作成が完了したらリージョン毎の設定を確認します。
us-east-1
ap-northeast-1
以上です。